/**
 * @author Laboratio Av I
 * @since 18/04/2012 14:03:56
 */
package ar.edu.utn.frgp.banco.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


import ar.edu.utn.frgp.banco.dao.ClienteDao;
import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.impl.CuentaDaoImpl;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.RecursoServiceCuenta;

public class RecursoServiceCuentaImpl implements RecursoServiceCuenta {


	private CuentaDao cuentaDao;
	private ClienteDao clienteDao; 
	

	public RecursoServiceCuentaImpl() {      //esto no se que es
		setCuentaDao (new CuentaDaoImpl());
	}
	
	
	public CuentaDao getCuentaDao() {
		return cuentaDao;
	}
	
	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}
	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}


	public ClienteDao getClienteDao() {
		return clienteDao;
	}
	
	private Cliente existeClienteActivo(int dni) {
		try {

			Cliente cl = new Cliente();
			cl=cuentaDao.obtenerClienteActivoPreCuenta(dni); //le mando el dni y si existe devuelve todos los datos del cliente
			return cl;
			//			if (cl == null)
//			{
//				return false;
//			}
//			else
//			{	if (cl.getEstado()==1)// si el cliente existe veo si esta activo si es asi se crea la cuenta
//				{return true;}
//				else
//				{return false;}
//			}			
		} catch (DataAccessException e) {
			return null;
		}		
			
	}
	
	
	
	public void crearCuenta(Cuenta cuenta) throws ServiceException {
			Cliente cl = new Cliente();	
		if (cuenta != null) {
			
			cl=existeClienteActivo(cuenta.getDni());
			
		    if ( cl != null) { //PREGUNTAR SI YA EXISTE EL CLIENTE Y LA CUENTA SI EXITES MENSAJE Y NO AGREGARLA
		    	
		    	if(cl.getEstado()==1){
				try {
					cuentaDao.altaCuenta(cuenta);
				} catch (DataAccessException e) {
					throw new ServiceException("Error de acceso a BD."+ e.getMessage());
				}
		    	}
		    	else{
		    		throw new ServiceException("Existe el Cliente pero esta dado de baja");
		    	}
		     } 
		     else {
		     throw new ServiceException("El cliente no existe");
		   }	
		} else {
			throw new ServiceException("El objeto cuenta es null");
		}
	}
	
	public void dasactivarCuenta(Cuenta cu) throws ServiceException{
		Integer  operacion ;
		Scanner B = new Scanner(System.in);
	
	System.out.println("buscando Cliente ...");
		
	if (!existeCuenta(cu)) {
		try {
			System.out.println("Esta seguro desea dar de baja esta cuenta?" );
			System.out.println("1-Si / 2-No" );
			operacion = B.nextInt();
				if (operacion == 1){
				cuentaDao.bajarCuenta(cu);
				}
				else
				{
					System.out.println("no se dio de baja la cuenta");
				}
			}
		  catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
		  	}
	} else {
		throw new ServiceException("El cuenta no existe");
		}
	}
	
	private boolean existeCuenta(Cuenta cuenta) {
		
		Cuenta cu = new Cuenta();
			 
//		 try {
//			CuentaDao.ValidarCuenta(cu);
//		} catch (DataAccessException e1) {
//			return false;
//		}
			
		try {
			
			cu = (Cuenta) cuentaDao.obtenerCuenta(cuenta.getNrocuenta());
			
			if (cu == null) {return true;}
			else            {return false;}	
		} catch (DataAccessException e) {
			return false;
		}		
	}
	
	@Override
	public void modificarCuenta(Cuenta cu) throws ServiceException {
	Integer  operacion ;
	Scanner B = new Scanner(System.in);
		
	System.out.println("buscando Cliente ...");
	if (!existeCuenta(cu)) {
		try {
			System.out.println("Esta seguro desea modificar esta cuenta?" );
			System.out.println("1-Si / 2-No" );
			operacion = B.nextInt();
				if (operacion == 1){
				cuentaDao.actualizarCuenta(cu);
				}
				else
				{
					System.out.println("no se modifico la cuenta");
				}
			}
		  catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
		  	}
	} else {
		throw new ServiceException("La cuenta no existe");
		}	
		
	}
	
	public List<Cuenta> listarCajaAhorroActivos(int dni) throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerCajaAhorroActivos(dni);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	}
	
	@Override
	public List<Cuenta> listarTodaCajaAhorro(int dni) throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerTodaCajaAhorro(dni);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	}
	
	@Override
	public List<Cuenta> listarCuentasCorrientesActivos(int dni) throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerCuentasCorrientesActivos(dni);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	}
	
	@Override
	public List<Cuenta> listarTodaCuentasCorrientes(int dni) throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerTodaCuentasCorrientes(dni);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	}
	
	
	
	
	
	public void modificarSaldoCuenta(Cuenta cu) throws ServiceException {
//		Integer  operacion ;
//		Scanner B = new Scanner(System.in);
		
//	System.out.println("buscando Cuenta ...");
//	if (!existeCliente(cl)) {
		try {
//			System.out.println("Confirma el movimiento en la cuenta?" );
//			System.out.println("1-Si / 2-No" );
//			operacion = B.nextInt();
//				if (operacion == 1){
				cuentaDao.actualizarSaldoCuenta(cu.getSaldo(), cu.getNrocuenta());
//				}
//				else
//				{
//					System.out.println("se cancelo la operacion");
//				}
			}
		  catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
		  	}
//	} else {
//		throw new ServiceException("El cliente no existe");
//		}	
		
	}


	@Override
	public Cuenta buscarCuenta(int nroCuenta) throws ServiceException {
		
		Cuenta cu = new Cuenta();
		
		try {
			cu = cuentaDao.obtenerUnaCuenta(nroCuenta);
		} catch (DataAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return cu;
		
		
	}


	@Override
	public List<Cuenta> listarCuentasActivas(Integer dni)throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerCuentasActivas(dni);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
		
	}


	@Override
	public List<Cuenta> listarTodasLasCuentasActivas() throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerTodasLasCuentasActivas();
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	
	}
	
	
	
	@Override
	public List<Cuenta> listarCuentas(int dni, int estado) throws ServiceException {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		try {
			cuentas = cuentaDao.traerCuentas(dni,estado);
	
		} catch (DataAccessException e) {
			throw new ServiceException("Error de acceso a BD." + e.getMessage());
			}
		return cuentas;
	}
	
	
	
	


	
}